/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.plugins.designer;

import java.math.BigInteger;
import java.util.List;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;
import stud.cp.core.plugins.WrongPageRequest;
import stud.cp.user.dbaccess.OracleDAOFactory;
import stud.cp.user.valueobjects.DBObject;
import stud.cp.user.valueobjects.DBObjectType;

/**
 * Плагин, отвечающий за конструктор меню.
 *
 * @author morfant
 */
@Stateless
public class DesignerPluginBean implements DesignerPluginBeanLocal {

    /**
     * Фабрика DAO классов.
     */
    private OracleDAOFactory oracleDAOFactory = null;
    /**
     * Логгер.
     */
    private static Logger logger = Logger.getLogger(DesignerPluginBean.class);

    /**
     * Метод, выполняющий бизнес логику плагина.
     *
     * @param req Реквест.
     * @return Класс плагин.
     */
    @Override
    public PluginRouter perform(HttpServletRequest req) {
        String subaction = req.getParameter(PluginConst.SUBACTION);


        if ((subaction != null) && (!subaction.equals(""))) {
            try {

                oracleDAOFactory = new OracleDAOFactory();
                oracleDAOFactory.initialize();
                /*
                 * Список действий которые могут выполниться.
                 */

//                if (subaction.equals(DesignerPluginConst.GET_OBJECT_TYPE_HEIRS)) {
//                    return getListOfProducts(req);
//                }

//                if (subaction.equals(PluginConst.GET_LIST)) {/*Список данных*/
//                    return getListPage(req);
//                }
//
                /*
                 * Страница добавления
                 */
                if (subaction.equals(PluginConst.GET_ADD_PAGE)) {
                    return getAddPage(req);
                }

                /*
                 * Добавление новых данных
                 */
                if (subaction.equals(PluginConst.NEW_DATA)) {
                    return newData(req);
                }

//                /*Страница редактирования*/
//                if (subaction.equals(PluginConst.GET_EDIT_PAGE)) {
//                    return getEditPage(req);
//                }
//
//                /*Сохранение измененных данных*/
//                if (subaction.equals(PluginConst.SAVE_DATA)) {
//                    return saveData(req);
//                }
//
                /*Страница удаления*/
                if (subaction.equals(PluginConst.GET_DELETE_PAGE)) {
                    return getDeletePage(req);
                }
//
//                /*Удаление данные*/
//                if (subaction.equals(PluginConst.DELETE_DATA)) {
//                    return deleteData(req);
//                }
//
//                /*Страница просмотра данных о типе оружия*/
//                if (subaction.equals(PluginConst.GET_VIEW_PAGE)) {
//                    return getViewPage(req);
//                }
//
//                /*Страница со списком свойств, принадлежащий данному типу оружия.*/
//                if (subaction.equals(PluginConst.GET_WEAPON_TYPE_PROPERTIES_LIST)) {
//                    return getObjectTypePropertyListPage(req);
//                }
//
//                /*Страница с диалогом для пользователя, который хочет исключить свойство из типа оружия.*/
//                if (subaction.equals(PluginConst.EXCLUDE_PROPERTY_FROM_WEAPON_TYPE_PAGE)) {
//                    return getExcludePropertyFromObjectTypePage(req);
//                }
//
//                /*Исключение свойства из объектного типа.*/
//                if (subaction.equals(PluginConst.EXCLUDE_PROPERTY_FROM_WEAPON_TYPE)) {
//                    return excludePropertyFromObjectType(req);
//                }
//
//                /*Страница добавления свойств к типу оружия.*/
//                if (subaction.equals(PluginConst.ADD_PROPERTIES_TO_WEAPON_TYPE_PAGE)) {
//                    return getAddPropertiesToObjectTypePage(req);
//                }
//
//                /*Добавление свойств к объектному типу*/
//                if (subaction.equals(PluginConst.ADD_PROPERTIES_TO_WEAPON_TYPE)) {
//                    return addPropertiesToObjectType(req);
//                }

                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Действия для данного типа поддействия не найдено. Тип поддействия = " + subaction);
            } catch (DAOException ex) {
                logger.debug("Error due access to database. "
                        + "Plugin = ObjectTypePluginBean. "
                        + "Subaction=" + subaction, ex);
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Ошибка доступа к базе данных " + ex.getMessage());
            } catch (WrongPageRequest ex) {
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Данные из реквеста ошибочны :\n" + ex.getMessage());
            } finally {
                if (oracleDAOFactory != null) {
                    try {
                        oracleDAOFactory.cleanUp();
                    } catch (DAOException ex) {
                        logger.debug("Error due access to database. "
                                + "Plugin = ObjectTypePluginBean. "
                                + "Subaction=" + subaction, ex);
                        req.setAttribute(PluginConst.ERROR_MESSAGE,
                                "Ошибка доступа к базе данных " + ex.getMessage());
                    }
                }
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE,
                    "Тип поддействия не задан.");
        }

        return new PluginRouter("/errorpage.jsp");
    }

    private PluginRouter getListOfProducts(HttpServletRequest req) throws DAOException, WrongPageRequest {
        BigInteger objectTypeId =
                new BigInteger(req.getParameter(PluginConst.OBJECT_TYPE_ID));
        DBObjectType objectType = oracleDAOFactory.getObjectTypesDAO().getById(objectTypeId);
//TODO::Добавить дополнительные обработки ошибок с входными данными.
        if (objectType != null) {
//            req.setAttribute(DesignerPluginConst.PARENT_OBJECT_TYPE, objectType);
            if (objectType.getIsAbstract()) {
                List<DBObjectType> listOfDBObjectTypes =
                        oracleDAOFactory.getObjectTypesDAO().getObjectTypeHeirs(objectTypeId);
                req.setAttribute(PluginConst.OBJECT_TYPE_LIST, listOfDBObjectTypes);
                return new PluginRouter("/Designer/Products/ProductTypesTable.jsp");
            } else {
                List<DBObject> listOfDBObjects =
                        oracleDAOFactory.getObjectDAO().getAllObjectByObjectType(objectTypeId);
//                req.setAttribute(DesignerPluginConst.OBJECT_HEIRS_LIST, listOfDBObjects);
                return new PluginRouter("/Designer/Products/ProductsTable.jsp");
            }
        } else {
            throw new WrongPageRequest("Тип блюда с таким id=" + objectTypeId + " не существует. ");
        }
    }

    private PluginRouter getAddPage(HttpServletRequest req) throws DAOException {
        BigInteger objectTypeId =
                new BigInteger(req.getParameter(PluginConst.OBJECT_TYPE_ID));
        DBObjectType objectType = oracleDAOFactory.getObjectTypesDAO().getById(objectTypeId);
//        req.setAttribute(DesignerPluginConst.PARENT_OBJECT_TYPE, objectType);
        return new PluginRouter("/Designer/Products/AddProductType.jsp");
    }

    /**
     * Метод, позволяющий добавлять новые данные.
     *
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter newData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.OBJECT_TYPE_NAME);
        String description = req.getParameter(PluginConst.OBJECT_TYPE_DESCRIPTION);
        BigInteger parentId = new BigInteger(req.getParameter(PluginConst.OBJECT_TYPE_PARENT_ID));

        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Имя типа оружия не должно быть пустым!";
        }
        if ((description == null) || (description.equals(""))) {
            error_message = error_message + " Описание типа оружия не должно быть пустым.";
        }

        //TODO::Добавить дополнительные обработки ошибок с входными данными.
        if (error_message.equals("")) {
            BigInteger object_type_id = oracleDAOFactory.getObjectTypesDAO().
                    create(new DBObjectType(name, description, parentId, false));

            DBObjectType objectType = oracleDAOFactory.getObjectTypesDAO().getById(parentId);

            return new PluginRouter("designer-action.do"
                    + "?"
                    + PluginConst.SUBACTION
                    + "="
//                    + DesignerPluginConst.GET_OBJECT_TYPE_HEIRS
                    + "&"
                    + PluginConst.OBJECT_TYPE_ID
                    + "="
                    + objectType.getObject_type_id(), false);
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getAddPage(req);
        }
    }
    
    /**
     * Метод, который позволяет
     * перейти на страницу удаления элемента.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getDeletePage(HttpServletRequest req) throws DAOException, WrongPageRequest { 	
        String object_type_id = req.getParameter(PluginConst.OBJECT_TYPE_ID);
        if (object_type_id != null) {
            DBObjectType objectType = oracleDAOFactory.getObjectTypesDAO().getById(new BigInteger(object_type_id));
            if (objectType != null) {
                req.setAttribute(PluginConst.OBJECT_TYPE, objectType);
                return new PluginRouter("/Designer/Products/DeleteProductType.jsp");
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + object_type_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }
}
